<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script type="module">
    import { request } from "../js/ajax.js";

    // Promise的静态方法 -> 构造函数Promise自己的方法

    // Promise.allSettled()
    // 有时候，我们希望等到一组异步操作都结束了，不管每一个操作是成功还是失败，再进行下一步操作。但是，现有的 Promise 方法很难实现这个要求。
    // 为了解决这个问题，ES2020 引入了Promise.allSettled()方法，用来确定一组异步操作是否都结束了（不管成功或失败）。所以，它的名字叫做”Settled“，包含了”fulfilled“和”rejected“两种情况。

    // Promise.allSettled()方法接受一个数组作为参数，数组的每个成员都是一个 Promise 对象，并返回一个新的 Promise 对象。只有等到参数数组的所有 Promise 对象都发生状态变更（不管是fulfilled还是rejected），返回的 Promise 对象才会发生状态变更。










    // 模拟封装Promise.race()
    Promise.myAllSettled = function (list) {
        // var list = [p1, p2, p3];
        return new Promise(function (resolve, reject) {
            var arr = [];
            var count = 0;
            for (let i = 0; i < list.length; i++) {
                let p = list[i]; // 每一个Promise实例 (未来改变状态和存储结果 -> 异步)
                p.then(data => { // Promise实例状态改变之后(fulfilled) -> 执行的函数 (先变先执行)
                    var obj = { status: "fulfilled", value: data }
                    list[i] = obj;
                    count++;
                    if (count == list.length) { //所有Promise实例状态改变以后
                        resolve(list);
                    }
                }).catch(err => {// Promise实例状态改变之后(rejected) -> 执行的函数
                    var obj = { status: "rejcted", reason: err }
                    list[i] = obj;
                    count++;
                    if (count == list.length) {//所有Promise实例状态改变以后
                        resolve(list);
                    }
                })
            }
        })
    }

    var p1 = getNumAsync(1, 2000);
    var p2 = getNumAsync(2, 1000, false);
    var p3 = getNumAsync(3, 3000);

    // var p = Promise.myAllSettled([p1, p2, p3]);
    var p = Promise.allSettled([p1, p2, p3]);

    p.then(arg => {
        console.log("fulfilled", arg);
    }).catch(err => {
        console.log("rejected", err);
    })









    // 调用此方法 返回Promise对象(pending)  指定时间之后变为 fulfilled/rejected
    function getNumAsync(num = 0, delay = 0, isResolve = true) {
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                isResolve ? resolve(num) : reject(num);
            }, delay)
        })
    }



</script>

</html>